/**
  ******************************************************************************
  * @file    Project/STM32F10x_StdPeriph_Template/stm32f10x_it.c
  * @author  MCD Application Team
  * @version V3.5.0
  * @date    08-April-2011
  * @brief   Main Interrupt Service Routines.
  *          This file provides template for all exceptions handler and
  *          peripherals interrupt service routine.
  ******************************************************************************
  * @attention
  *
  * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
  * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
  * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
  * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
  * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
  * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
  *
  * <h2><center>&copy; COPYRIGHT 2011 STMicroelectronics</center></h2>
  ******************************************************************************
  */

/* Includes ------------------------------------------------------------------*/
#include "stm32f10x_it.h"
#include "Delay.h"
#include "ESP8266.h"
#include "window.h"
#include "FreeRTOS.h"
#include "Semphr.h"
#include "Task.h"
#include "EDP.h"
extern USART cout,NetworkIO;
extern ESP8266 Network;
extern uint8_t* NetworkData;
extern DMA NetworkTx,NetworkRx;
extern TIM HeartBeat;
extern EXTI MAXIntrrupt;
extern "C" {
	/** @addtogroup STM32F10x_StdPeriph_Template
	  * @{
	  */

	/* Private typedef -----------------------------------------------------------*/
	/* Private define ------------------------------------------------------------*/
	/* Private macro -------------------------------------------------------------*/
	/* Private variables ---------------------------------------------------------*/
	/* Private function prototypes -----------------------------------------------*/
	/* Private functions ---------------------------------------------------------*/

	/******************************************************************************/
	/*            Cortex-M3 Processor Exceptions Handlers                         */
	/******************************************************************************/

	/**
	  * @brief  This function handles NMI exception.
	  * @param  None
	  * @retval None
	  */
	void NMI_Handler(void)
	{
	}

	/**
	  * @brief  This function handles Hard Fault exception.
	  * @param  None
	  * @retval None
	  */
	void HardFault_Handler(void)
	{
		/* Go to infinite loop when Hard Fault exception occurs */
		cout << "HardFault_Handler" << endl;
		while(1)
		{
		}
	}

	/**
	  * @brief  This function handles Memory Manage exception.
	  * @param  None
	  * @retval None
	  */
	void MemManage_Handler(void)
	{
		/* Go to infinite loop when Memory Manage exception occurs */
		//cout<<"MemManage_Handler"<<endl;
		while(1)
		{
		}
	}

	/**
	  * @brief  This function handles Bus Fault exception.
	  * @param  None
	  * @retval None
	  */
	void BusFault_Handler(void)
	{
		/* Go to infinite loop when Bus Fault exception occurs */
		//cout<<"BusFault_Handler"<<endl;
		while(1)
		{
		}
	}

	/**
	  * @brief  This function handles Usage Fault exception.
	  * @param  None
	  * @retval None
	  */
	void UsageFault_Handler(void)
	{
		/* Go to infinite loop when Usage Fault exception occurs */
//		cout<<"UsageFault_Handler"<<endl;
		while(1)
		{
		}
	}

	/**
	  * @brief  This function handles SVCall exception.
	  * @param  None
	  * @retval None
	  */
//	void SVC_Handler(void)
//	{
//	}

	/**
	  * @brief  This function handles Debug Monitor exception.
	  * @param  None
	  * @retval None
	  */
	void DebugMon_Handler(void)
	{
	}

	/**
	  * @brief  This function handles PendSVC exception.
	  * @param  None
	  * @retval None
	  */
//	void PendSV_Handler(void)
//	{
//	}

	/**
	  * @brief  This function handles SysTick Handler.
	  * @param  None
	  * @retval None
	  */
//	void SysTick_Handler(void)
//	{
//		if(Delay.counter)
//		{
//			Delay.counter--;
//		}
//	}

	void USART2_IRQHandler()
	{
		portBASE_TYPE isHigh;
		if(NetworkIO.GetITStatus(USART_IT_IDLE))
		{
			NetworkIO.ClearITPendingBit(USART_IT_IDLE);
			NetworkIO.ReceiveData();
			Network.ReciveFlag = true;
			if(Network.GetReciveData(&NetworkData))//收到网络数据
			{
				xSemaphoreGiveFromISR(NetworkRecive,&isHigh);//给出收到网络数据信号量
				if(isHigh==pdTRUE)//被中断任务优先级高于当前任务
					taskYIELD();//强制上下文切换
			}
		}
	}
	void DMA1_Channel7_IRQHandler()//NetTx
	{
		portBASE_TYPE isHigh;
		if(NetworkTx.GetITStatus(DMA1_IT_TC7))
		{
			NetworkTx.ClearITPendingBit(DMA1_IT_TC7);
			xSemaphoreGiveFromISR(NetworkSendDone,&isHigh);//给出发送完成信号量
			if(isHigh==pdTRUE)//被中断任务优先级高于当前任务
				taskYIELD();//强制上下文切换
		}
	}
	void DMA1_Channel6_IRQHandler()//NetRx
	{
		if(NetworkRx.GetITStatus(DMA1_IT_TC6))
		{
			NetworkRx.ClearITPendingBit(DMA1_IT_TC6);
			Network.ClearBuffer();
		}
	}
	
	void TIM2_IRQHandler()//5S
	{
		static uint8_t buf[2] = {0xC0,0x00};//心跳包
		static UpLoadPacket_t Packet = {buf,false,sizeof(buf)};
		static uint16_t Counter = 0;
		if(HeartBeat.GetITStatus(TIM_IT_Update))
		{
			HeartBeat.ClearITPendingBit(TIM_IT_Update);
			Counter++;
			if(Counter==10)
			{
				Counter = 0;
				xQueueSend(NetworkUpload,&Packet,0);//将数据包写入发送队列
			}
		}
	}

	void EXTI15_10_IRQHandler()
	{
		if(MAXIntrrupt.GetITStatus())
		{
			MAXIntrrupt.ClearITPendingBit();
			if(isSystemRun)
			{
				portBASE_TYPE isHigh;
				xSemaphoreGiveFromISR(NewDataReady, &isHigh);
				if (isHigh == pdTRUE)//被中断任务优先级高于当前任务
					taskYIELD();//强制上下文切换
			}
			
		}
	}
	
	/******************************************************************************/
	/*                 STM32F10x Peripherals Interrupt Handlers                   */
	/*  Add here the Interrupt Handler for the used peripheral(s) (PPP), for the  */
	/*  available peripheral interrupt handler's name please refer to the startup */
	/*  file (startup_stm32f10x_xx.s).                                            */
	/******************************************************************************/

	/**
	  * @brief  This function handles PPP interrupt request.
	  * @param  None
	  * @retval None
	  */
	/*void PPP_IRQHandler(void)
	{
	}*/

	/**
	  * @}
	  */
}
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
